#include "drv_iic.h"



void drv_iic_init(void)
{
	GPIO_InitTypeDef  GPIO_InitStruct;
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
	GPIO_InitStruct.GPIO_OType = GPIO_OType_OD;
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;
	GPIO_InitStruct.GPIO_PuPd =GPIO_PuPd_NOPULL;
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, & GPIO_InitStruct);
	
}
void drv_iic_out(void)
{
	GPIO_InitTypeDef  GPIO_InitStruct;
	//RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
	GPIO_InitStruct.GPIO_OType = GPIO_OType_OD;
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_7;
	GPIO_InitStruct.GPIO_PuPd =GPIO_PuPd_NOPULL;
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, & GPIO_InitStruct);
}


void drv_iic_in(void)
{
	GPIO_InitTypeDef  GPIO_InitStruct;
	//RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN;
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_7;
	GPIO_InitStruct.GPIO_PuPd =GPIO_PuPd_NOPULL;
	GPIO_Init(GPIOB, & GPIO_InitStruct);
}



void drv_iic_start(void)
{
	SCL_L;
	drv_iic_out();

	SDA_H;
	SCL_H;
	drv_systick_us(5);
	SDA_L;
	drv_systick_us(5);
	SCL_L;
}
void drv_iic_stop(void)
{
	SCL_L;
	drv_iic_out();
	SDA_L;
	SCL_H;
	drv_systick_us(5);
	SDA_H;
	drv_systick_us(5);
}

void drv_iic_sendACK(void)
{
	SCL_L;
	drv_iic_out();
	SDA_L;
	SCL_H;
	drv_systick_us(5);
	SCL_L;
}

void drv_iic_sendNoACK(void)
{
	SCL_L;
	drv_iic_out();
	SDA_H;
	SCL_H;
	drv_systick_us(5);
	SCL_L;
}
uint16_t drv_iic_waitACK(void)
{   
	uint16_t time_out=0;
	SCL_L;
	drv_iic_in();
	SCL_H;
	while(READ_SDA)
	{
		time_out++;
		if(time_out>500)
		{
			drv_iic_stop();
			return NOACK;
		}
	}
		SCL_L;
		return ACK;
	
}

void drv_iic_senddata(uint8_t data)
{
	uint16_t i=0;
	SCL_L;
	drv_iic_out();
	for(i=0;i<8;i++)
		{
		if(data&0x80)
		{
			SDA_H;
		}
		else
			{
			SDA_L;
			}
		SCL_H;
		drv_systick_us(1);
		SCL_L;
		drv_systick_us(1);
		data=data<<1;
		}
}

uint8_t drv_iic_readdata(uint8_t flg_ack)
{
	uint8_t read_data = 0,i=0;
	SCL_L;
	drv_iic_in();
	for(i=0;i<8;i++)
	{
		read_data=read_data<<1;
		SCL_H;
		if(READ_SDA)
	 {
		read_data|=0x01;
	 }
		drv_systick_us(1);
		SCL_L;
		drv_systick_us(1);
	}
	if(flg_ack == ACK)
	{
		drv_iic_sendACK();
	}
	else
	{
	 	drv_iic_sendNoACK();
	}
	SCL_L;
	return read_data;
}







